package logica.interfaces;

import java.util.Date;

import logica.exceptions.InvalidActionException;
import logica.exceptions.InvalidBeginTimeException;
import logica.exceptions.InvalidDataException;
import logica.exceptions.InvalidEndTimeException;
import logica.exceptions.RequiredDataException;
import logica.exceptions.TimeExceedException;

/**
 * 
 * Interface que encapsula o comportamento .
 *
 */
public interface AuctionIF {

	/**
	 * Atualiza o id do leilao.
	 *
	 * @param id
	 *            O novo id.
	 * @throws RequiredDataException
	 *             Se o id for nulo ou vazio.
	 */
	public void setId(String id) throws RequiredDataException;

	/**
	 * Atualiza a descricao do leilao.
	 *
	 * @param description
	 *            A nova descricao.
	 * @throws RequiredDataException
	 *             Se a descricao for nula ou vazia.
	 */
	public void setDescripton(String description) throws RequiredDataException;

	/**
	 * Atualiza o dono do leilao.
	 *
	 * @param ownerLogin
	 *            O novo dono.
	 * @throws RequiredDataException
	 *             Se ownerLogin for nulo ou vazio.
	 */
	public void setAuctionOwner(String ownerLogin) throws RequiredDataException;

	/**
	 * Atualiza o produto que esta sob leilao.
	 *
	 * @param product
	 *            O novo id do produto.
	 * @throws RequiredDataException
	 *             Se o produto for nulo ou vazio.
	 */
	public void setProduct(String product) throws RequiredDataException;

	/**
	 * Atualiza o vencedor parcial do leilao.
	 *
	 * @param winnerLogin
	 *            O login do novo vencedor parcial.
	 * @throws RequiredDataException
	 *             Se o winnerLogin for nulo ou vazio.
	 */
	public void setPartialWinner(String winnerLogin)
			throws RequiredDataException;

	/**
	 * Atualiza o maior lance do leilao.
	 *
	 * @param bid
	 *            O novo maior lance.
	 * @throws InvalidDataException
	 *             Se o lance for negativo.
	 */
	public void setHigherBid(double bid) throws InvalidDataException;

	/**
	 * Atualiza a data de inicio do leilao.
	 *
	 * @param date
	 *            A data de inicio do leilao.
	 * @throws InvalidActionException
	 *             Se a data marcada acontecer antes da data atual.
	 */
	public void setDateBegin(Date date) throws InvalidActionException;

	/**
	 * Atualiza a data de fim do leilao.
	 *
	 * @param date
	 *            A data de fim do leilao.
	 * @throws InvalidActionException
	 *             Se a data marcada acontecer antes da data atual ou antes da
	 *             data de inicio.
	 */
	public void setDateFinish(Date date) throws InvalidActionException;

	/**
	 * Permite um usuario a dar um lance no leilao.
	 *
	 * @param userLogin
	 *            O login do usuario que da o lance.
	 * @param bid
	 *            O lance dado.
	 * @throws InvalidActionException
	 *             Se o lance for menor que o maior dado.
	 * @throws TimeExceedException
	 *             Se o tempo do leilao ja estuver terminado.
	 */
	public void makeBid(String userLogin, double bid)
			throws InvalidActionException, TimeExceedException;

	/**
	 * Retorna o identificador do leilao.
	 *
	 * @return O identificador do leilao.
	 */
	public String getId();

	/**
	 * Retorna a descricao do leilao.
	 *
	 * @return A descricao do leilao.
	 */
	public String getDescripton();

	/**
	 * Retorna o login do dono do leilao.
	 *
	 * @return O login do dono do leilao.
	 */
	public String getAuctionOwner();

	/**
	 * Retorna o id do produto sob leilao.
	 *
	 * @return O id do produto sob leilao.
	 */
	public String getProduct();

	/**
	 * Retorna o login do vencedor parcial do leilao.
	 *
	 * @return O login do vencedor parcial do leilao.
	 */
	public String getPartialWinner();

	/**
	 * Retorna o maior lance dado.
	 *
	 * @return O maior lance dado.
	 */
	public double getHigherBid();

	/**
	 * Retorna a data de inicio do leilao.
	 *
	 * @return A data de inicio do leilao.
	 */
	public Date getDateBegin();

	/**
	 * Retorna a data de fim do leilao.
	 *
	 * @return A data de fim do leilao.
	 */
	public Date getDateFinish();

	/**
	 * Retorna true se o usuario passado como parametro for participante deste
	 * leilao.
	 *
	 * @return True caso o usuario seja participado do leilao.
	 */
	public boolean isParticipant(String userLogin);

	/**
	 * Adiciona um participante a lista de participantes. Apenas eh adicionado
	 * se ele nao contiver na lista ainda.
	 *
	 * @param participantLogin
	 *            O login do participante a ser adicionado.
	 */
	public void addParticipant(String participantLogin);

	/**
	 * Inicia um leilao.
	 *
	 * @throws InvalidBeginTimeException
	 *             Se for tentado iniciar o leilao antes do horario marcado.
	 */
	public void begin() throws InvalidBeginTimeException;

	/**
	 * Termina um leilao.
	 *
	 * @throws InvalidEndTimeException
	 *             Se for tentado finalizar um leilao antes da hora marcada.
	 */
	public void end() throws InvalidEndTimeException;

	public String getResumo();
}
